#include <stdio.h> 
#include <stdlib.h>
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>

#define MAX 128
int main(int argc, char *argv[])
{
        //Variables para almacenar el nombre de los ficheros
        char *fich1;
        char *fich2;
        //Variable a utilizar como buffer de lectura/escritura
        char buflectura[MAX];
        char bufescritura[MAX];
        //Variable para almacenar la tuberia
        int tuberia[2];
        //Si recibimos parametros
        if (argc>2) {
                //Asignamos los valores recibidos como parametro
                fich1=argv[1];
                fich2=argv[2];
                //Creamos la tuberia anonima
                if (pipe(tuberia) == -1)
                {
                        perror("Error al crear la tuberia");
                        exit(EXIT_FAILURE);
                }
                //Variable para almacenar el codigo de retorno de la función fork
                pid_t hijo=0;
                //Creamos hijo
                hijo=fork();
                switch (hijo)
                {
                        case -1: exit(EXIT_FAILURE);
                                break;
                        //Codigo a ejecutar por el proceso hijo.
                        case 0:
                        //Cerramos el descriptor de escritura de la tuberia
                        close(tuberia[1]);
                        int fdw;
                        if((fdw=open(fich2,O_CREAT | O_TRUNC | O_WRONLY,0644))<0)
                        {
                                perror("Error abriendo archivo de salida");
                                close(fdw);
                                exit(EXIT_FAILURE);
                        }
                        //Mientras haya contenido en la tuberia lo escribimos en el fichero
			int leidol=0;
                        while ( (leidol=read(tuberia[0],buflectura,MAX))>0)
                        {
                                if (write(fdw,buflectura,leidol)<0)
                                {
                                        perror("Error de escritura en el fichero de salida");
                                        exit(EXIT_FAILURE);
                                }
                        }
                        //Cerramos descriptor de lectura de la tuberia
                        close(tuberia[0]);
                        close(fdw);
                        printf("Hijo con pid %d lee tuberia y escribe en %s \n",getpid(),fich2);
                        exit(0);
                        break;
                        //Codigo a ejecutar por el proceso padre
                        default:
                        //Cerramos el descriptor de lectura de la tuberia
                        close(tuberia[0]);
                        //Abrimos el primer fichero para lectura
                        int fdr=0;
                        if((fdr=open(fich1, O_RDONLY))<0)
                        {
                                perror("Error abriendo el archivo de entrada");
                                close(fdr);
                                exit(EXIT_FAILURE);
                        }
			int leidoe=0;
                        while ((leidoe=read(fdr,bufescritura,MAX))>0) //Mientras haya contenido
                        {
                                //Escribimos en la tuberia
                                if(write(tuberia[1], bufescritura, leidoe)<0)
                                {
                                        perror("Error de escritura en la tuberia");
                                        exit(EXIT_FAILURE);
                                }
                        }
                        close(tuberia[1]);
                        close(fdr);
                        printf("Padre con pid %d escribe tuberia y lee de %s\n",getpid(),fich1);
                        exit(0);
                        break;
                }
        }
        else
        {
                printf("¡¡ERROR!! ¡¡NO SE HAN RECIBIDO 2 PARAMETROS!!\n");
        };
}
